স্প্রিং বুট ORM-এ Cascade এবং Fetch Type হলো JPA এর গুরুত্বপূর্ণ ফিচার, যা ডাটাবেস সম্পর্ক (Database Relationships) পরিচালনা করতে ব্যবহৃত হয়। এগুলো Parent এবং Child Entity এর মধ্যে সম্পর্ক এবং ডেটা ফেচিং কৌশল নির্ধারণ করতে সাহায্য করে।
Cascade টাইপ
Cascade নির্ধারণ করে Parent Entity-তে ডেটা অপারেশন করার সময় তা Child Entity-তে কীভাবে প্রভাব ফেলবে। উদাহরণস্বরূপ, যদি Parent Entity-তে একটি অপারেশন চালানো হয় (যেমন: সেভ, ডিলিট), তবে সেই অপারেশন Child Entity-তেও স্বয়ংক্রিয়ভাবে প্রয়োগ করা হবে।
Cascade টাইপসমূহ
- CascadeType.PERSIST: Parent Entity সেভ করার সময় Child Entity-ও সেভ হয়।
- CascadeType.MERGE: Parent Entity মুডিফাই করার সময় Child Entity-ও মুডিফাই হয়।
- CascadeType.REMOVE: Parent Entity মুছে ফেলার সময় Child Entity-ও মুছে যায়।
- CascadeType.REFRESH: Parent Entity রিফ্রেশ করলে Child Entity-ও রিফ্রেশ হয়।
- CascadeType.DETACH: Parent Entity আলাদা করলে Child Entity-ও আলাদা হয়।
- CascadeType.ALL: উপরোক্ত সব অপারেশন Parent এবং Child উভয় Entity-তে প্রয়োগ হয়।
উদাহরণ
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<Employee> employees;
// Getter এবং Setter
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getter এবং Setter
}
উপরের কোডে, CascadeType.ALL ব্যবহার করা হয়েছে। ফলে, যদি একটি Department সেভ বা ডিলিট করা হয়, তবে সংশ্লিষ্ট Employee গুলোতেও সেই অপারেশন প্রয়োগ হবে।
Fetch Type
Fetch Type Parent এবং Child Entity-এর মধ্যে সম্পর্কিত ডেটা কীভাবে ডাটাবেস থেকে রিট্রিভ করা হবে তা নির্ধারণ করে। এটি দুই প্রকারের হতে পারে:
- FetchType.EAGER: সম্পর্কিত ডেটা সঙ্গে সঙ্গে লোড হয়।
- FetchType.LAZY: সম্পর্কিত ডেটা তখনই লোড হয় যখন তা দরকার।
উদাহরণ
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Employee> employees;
// Getter এবং Setter
}
- FetchType.LAZY: ডিফল্ট মান। এখানে
employeesকেবল তখনই লোড হবে, যখন এটি স্পেসিফিক্যালি অ্যাক্সেস করা হবে। - FetchType.EAGER: Parent Entity লোড করার সময় Child Entity-ও স্বয়ংক্রিয়ভাবে লোড হবে।
@OneToMany(mappedBy = "department", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
Cascade এবং FetchType এর সংমিশ্রণ
কিছু পরিস্থিতিতে Cascade এবং Fetch Type একসঙ্গে ব্যবহার করা হয়। উদাহরণস্বরূপ:
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Employee> employees;
// Getter এবং Setter
}
এখানে:
- CascadeType.ALL নিশ্চিত করে যে Parent Entity-তে অপারেশন করলে Child Entity-তেও তা প্রভাব ফেলবে।
- FetchType.EAGER নিশ্চিত করে যে
employeesসম্পর্কিত ডেটা Parent Entity লোড করার সময়ই রিট্রিভ হবে।
বাস্তব জীবনের ব্যবহারের উদাহরণ
EAGER Fetch এর ব্যবহার
EAGER Fetch Type ব্যবহার করা হয় যখন Parent Entity-র সাথে Child Entity-র ডেটা প্রায়ই ব্যবহার করা হয়।
LAZY Fetch এর ব্যবহার
LAZY Fetch Type তখন ব্যবহার করা হয় যখন Child Entity-র ডেটা কেবল প্রয়োজনীয় সময়ে লোড করতে চাই।
CascadeType.ALL এর ব্যবহার
CascadeType.ALL ব্যবহার করা হয় যখন Parent এবং Child Entity-র মধ্যে অপারেশন একসঙ্গে পরিচালনা করতে হয়।
সারাংশ
- Cascade Parent এবং Child Entity-র মধ্যে অপারেশনের প্রভাব নির্ধারণ করে।
- Fetch Type Parent এবং Child Entity-র মধ্যে ডেটা লোডিং কৌশল নির্ধারণ করে।
- সঠিকভাবে Cascade এবং Fetch Type কনফিগারেশন করার মাধ্যমে ডাটাবেস অপারেশন এবং পারফরম্যান্স উন্নত করা যায়।
Read more